<?php

class Solicitud_Model extends CI_Model {

    const STR_NOMBRE_TABLA = 'solicitud';
    const STR_NOMBRE_TABLA_COTIZACION = 'cotizacion';
    const STR_NOMBRE_TABLA_MARCA = 'marca';
    const STR_NOMBRE_TABLA_MODELO = 'modelo';
    const STR_NOMBRE_TABLA_CLIENTE = 'usuario';
    const STR_NOMBRE_TABLA_PERSONA = 'persona';
    const STR_NOMBRE_TABLA_PERSONA_NATURAL = 'persona_natural';
    const STR_NOMBRE_TABLA_PERSONA_JURIDICA = 'persona_juridica';
    const STR_NOMBRE_TABLA_PERFIL = 'perfil';
    const STR_NOMBRE_TABLA_USUARIO_PERFIL = 'usuario_perfil';
    const STR_NOMBRE_TABLA_MONEDA = 'tabla_maestra tm1';
    const STR_NOMBRE_TABLA_ESTADO = 'tabla_maestra tm2';
    const STR_NOMBRE_TABLA_TALLER = 'tabla_maestra tm3';
    const STR_NOMBRE_TABLA_TIPO_PERSONA = 'tabla_maestra tm4';
    const STR_NOMBRE_COTIZACION_REPUESTO_SOLICITUD = "cotizacion_repuesto_solicitud";
    const STR_NOMBRE_REPUESTO = "repuesto";

    /**
     * Constructor
     * @author Fernando Esteban Valerio
     */
    public function __construct() {
        parent::__construct();
    }

    /**
     * Obtener la información de una solicitud.
     * @author Fernando Esteban Valerio
     * @param int $idSolicitud Id Solicitud
     * @return array
     */
    public function getSolicitud($idSolicitud) {
        $this->db->where('id_solicitud', $idSolicitud);
        $query = $this->db->get(self::STR_NOMBRE_TABLA);
        return $query->result();
    }

    /**
     * Obtener las solicitudes para un cliente determinado (Bandeja de Solicitudes - Cliente).
     * @author Fernando Esteban Valerio
     * @param int $idCliente Id Cliente
     * @return array
     */
    public function getListSolicitudBandeja($idCliente) {
        $this->db->select(
                "solicitud.id_solicitud AS id_solicitud,solicitud.fecha_registro AS fecha_registro,tm1.valor_1 AS nomMoneda,
                 solicitud.placa AS placa,marca.nombre AS nomMarca,modelo.nombre AS nomModelo,solicitud.ano AS anho,tm3.valor_1 AS nomTaller,
                 solicitud.otro_taller AS otroTaller,solicitud.id_estado AS idEstado,tm2.valor_1 AS nomEstado,solicitud.igv AS igv");
        $this->db->from(self::STR_NOMBRE_TABLA);
        $this->db->join(self::STR_NOMBRE_TABLA_MONEDA, "tm1.id_tabla_maestra = solicitud.id_moneda");
        $this->db->join(self::STR_NOMBRE_TABLA_MODELO, "modelo.id_modelo = solicitud.id_modelo");
        $this->db->join(self::STR_NOMBRE_TABLA_MARCA, "marca.id_marca = modelo.id_marca");
        $this->db->join(self::STR_NOMBRE_TABLA_TALLER, "tm3.id_tabla_maestra = solicitud.id_taller");
        $this->db->join(self::STR_NOMBRE_TABLA_ESTADO, "tm2.id_tabla_maestra = solicitud.id_estado");
        $this->db->join(self::STR_NOMBRE_TABLA_CLIENTE, "usuario.id_usuario = solicitud.id_usuario");
        $this->db->where('solicitud.id_usuario', $idCliente);
        $this->db->order_by('solicitud.fecha_registro', 'DESC');
        $query = $this->db->get();
        return $query->result();
    }

    /**
     * Obtener las solicitudes registradas en el sistema (Bandeja de Solicitudes - Administrador).
     * @author Fernando Esteban Valerio
     * @return array
     */
    public function getListSolicitud() {
        $sql = "SELECT * FROM
                (SELECT solicitud.id_solicitud AS id_solicitud,solicitud.fecha_registro AS fecha_registro,tm1.valor_1 AS nomMoneda,
                solicitud.placa AS placa,marca.nombre AS nomMarca,modelo.nombre AS nomModelo,solicitud.ano AS anho,tm3.valor_1 AS nomTaller,
                solicitud.otro_taller AS otroTaller,solicitud.id_estado AS idEstado,tm2.valor_1 AS nomEstado,solicitud.igv AS igv,
                tm4.valor_1 AS tipoPersona,persona_natural.nombres AS dato1,persona_natural.apellidos AS dato2
                FROM " . self::STR_NOMBRE_TABLA . "
                JOIN " . self::STR_NOMBRE_TABLA_MONEDA . " ON tm1.id_tabla_maestra = solicitud.id_moneda
                JOIN " . self::STR_NOMBRE_TABLA_MODELO . " ON modelo.id_modelo = solicitud.id_modelo
                JOIN " . self::STR_NOMBRE_TABLA_MARCA . " ON marca.id_marca = modelo.id_marca
                JOIN " . self::STR_NOMBRE_TABLA_TALLER . " ON tm3.id_tabla_maestra = solicitud.id_taller
                JOIN " . self::STR_NOMBRE_TABLA_ESTADO . " ON tm2.id_tabla_maestra = solicitud.id_estado
                JOIN " . self::STR_NOMBRE_TABLA_CLIENTE . " ON usuario.id_usuario = solicitud.id_usuario
                JOIN " . self::STR_NOMBRE_TABLA_PERSONA . " ON persona.id_persona = usuario.id_persona
                JOIN " . self::STR_NOMBRE_TABLA_TIPO_PERSONA . " ON tm4.id_tabla_maestra = persona.id_tipo_cliente
                JOIN " . self::STR_NOMBRE_TABLA_PERSONA_NATURAL . " ON persona_natural.id_persona = persona.id_persona
                UNION
                SELECT solicitud.id_solicitud AS id_solicitud,solicitud.fecha_registro AS fecha_registro,tm1.valor_1 AS nomMoneda,
                solicitud.placa AS placa,marca.nombre AS nomMarca,modelo.nombre AS nomModelo,solicitud.ano AS anho,tm3.valor_1 AS nomTaller,
                solicitud.otro_taller AS otroTaller,solicitud.id_estado AS idEstado,tm2.valor_1 AS nomEstado,solicitud.igv AS igv,
                tm4.valor_1 AS tipoPersona,persona_juridica.razon_social AS dato1,persona_juridica.ruc AS dato2
                FROM " . self::STR_NOMBRE_TABLA . "
                JOIN " . self::STR_NOMBRE_TABLA_MONEDA . " ON tm1.id_tabla_maestra = solicitud.id_moneda
                JOIN " . self::STR_NOMBRE_TABLA_MODELO . " ON modelo.id_modelo = solicitud.id_modelo
                JOIN " . self::STR_NOMBRE_TABLA_MARCA . " ON marca.id_marca = modelo.id_marca
                JOIN " . self::STR_NOMBRE_TABLA_TALLER . " ON tm3.id_tabla_maestra = solicitud.id_taller
                JOIN " . self::STR_NOMBRE_TABLA_ESTADO . " ON tm2.id_tabla_maestra = solicitud.id_estado
                JOIN " . self::STR_NOMBRE_TABLA_CLIENTE . " ON usuario.id_usuario = solicitud.id_usuario
                JOIN " . self::STR_NOMBRE_TABLA_PERSONA . " ON persona.id_persona = usuario.id_persona
                JOIN " . self::STR_NOMBRE_TABLA_TIPO_PERSONA . " ON tm4.id_tabla_maestra = persona.id_tipo_cliente
                JOIN " . self::STR_NOMBRE_TABLA_PERSONA_JURIDICA . " ON persona_juridica.id_persona = persona.id_persona) tmp
                ORDER BY tmp.fecha_registro DESC";
        $query = $this->db->query($sql);
        return $query->result();
    }

    /**
     * Obtener los repuestos cotizados por el cliente para una solicitud.
     * @author Fernando Esteban Valerio
     * @param int $idSolicitud Id Solicitud
     * @return aray
     */
    public function getRepuestoCotXSolicitud($idSolicitud) {
        $sql = "SELECT repuesto.cod_repuesto AS codigo,repuesto.nombre AS nombre,cotizacion_repuesto_solicitud.cantidad AS cantidad,
                cotizacion_repuesto_solicitud.precio AS precio,cotizacion_repuesto_solicitud.total,cotizacion.id_cotizacion AS cotizacion,
                persona_juridica.razon_social AS razon,repuesto.id_repuesto AS repuesto 
                FROM " . self::STR_NOMBRE_TABLA . "," . self::STR_NOMBRE_TABLA_COTIZACION . ","  .self::STR_NOMBRE_COTIZACION_REPUESTO_SOLICITUD . "," .
                self::STR_NOMBRE_REPUESTO . "," . self::STR_NOMBRE_TABLA_CLIENTE . "," . self::STR_NOMBRE_TABLA_PERSONA . "," . self::STR_NOMBRE_TABLA_PERSONA_JURIDICA . " WHERE 
                cotizacion.id_usuario = usuario.id_usuario AND 
                usuario.id_persona = persona.id_persona AND 
                persona.id_persona = persona_juridica.id_persona AND 
                solicitud.id_solicitud = cotizacion.id_solicitud AND
                cotizacion.id_cotizacion = cotizacion_repuesto_solicitud.id_cotizacion AND
                repuesto.id_repuesto = cotizacion_repuesto_solicitud.id_repuesto AND
                cotizacion_repuesto_solicitud.seleccionado = 1 AND solicitud.id_solicitud = '" . $idSolicitud . "' ORDER BY repuesto ASC";
        $query = $this->db->query($sql);
        return $query->result();     
    }                
    
    /**
     * Registrar la información de una solicitud.
     * @author Fernando Esteban Valerio
     * @param array $data Arreglo de datos de la solicitud
     */
    public function insert($data) {
        $this->db->set('id_usuario', $data['id_usuario']);
        $this->db->set('igv', $data['igv']);
        $this->db->set('id_moneda', $data['id_moneda']);
        $this->db->set('id_tipo_carroceria', $data['id_tipo_carroceria']);
        $this->db->set('id_modelo', $data['id_modelo']);
        $this->db->set('ano', $data['anho']);
        $this->db->set('placa', $data['placa']);
        $this->db->set('vin', $data['vin']);
        $this->db->set('version', $data['version']);
        $this->db->set('foto_vehiculo', $data['foto_vehiculo']);
        $this->db->set('id_estado', $data['id_estado']);
        $this->db->set('fecha_registro', $data['fecha_registro']);
        $this->db->set('entrega_taller', $data['entrega_taller']);
        $this->db->set('id_taller', $data['id_taller']);
        $this->db->set('otro_taller', $data['otro_taller']);
        $this->db->set('usuario_registro', $data['usuario_creacion']);
        $this->db->set('fecha_registro', $data['fecha_creacion']);
        $this->db->insert(self::STR_NOMBRE_TABLA);
    }

    /**
     * Actualizar la información de una solicitud.
     * @author Fernando Esteban Valerio
     * @param array $data Arreglo de datos de la solicitud
     */
    public function update($data) {
        $this->db->set('igv', $data['igv']);
        $this->db->set('id_moneda', $data['id_moneda']);
        $this->db->set('id_tipo_carroceria', $data['id_tipo_carroceria']);
        $this->db->set('id_modelo', $data['id_modelo']);
        $this->db->set('ano', $data['anho']);
        $this->db->set('placa', $data['placa']);
        $this->db->set('vin', $data['vin']);
        $this->db->set('version', $data['version']);
        $this->db->set('foto_vehiculo', $data['foto_vehiculo']);
        $this->db->set('id_estado', $data['id_estado']);
        $this->db->set('entrega_taller', $data['entrega_taller']);
        $this->db->set('id_taller', $data['id_taller']);
        $this->db->set('otro_taller', $data['otro_taller']);
        $this->db->set('usuario_modificacion', $data['usuario_modificacion']);
        $this->db->set('fecha_modificacion', $data['fecha_modificacion']);
        $this->db->where('id_solicitud', $data['id_solicitud']);
        $this->db->update(self::STR_NOMBRE_TABLA);
    }

    /**
     * Actualizar el estado de una solicitud.
     * @author Fernando Esteban Valerio
     * @param array $data Arreglo de datos de la solicitud
     */
    public function updateEstado($data) {
        $this->db->set('id_estado', $data['id_estado']);
        $this->db->set('usuario_modificacion', $data['usuario_modificacion']);
        $this->db->set('fecha_modificacion', $data['fecha_modificacion']);
        $this->db->where('id_solicitud', $data['id_solicitud']);
        $this->db->update(self::STR_NOMBRE_TABLA);
    }

    /**
     * Devolver el id insertado.
     * @author Fernando Esteban Valerio
     * @return int
     */
    public function getLastInserted() {
        return $this->db->insert_id();
    }

    /**
     * Validar si existe el numero de caso.
     * @param int $idSolicitud Id Solicitud
     * @param int $idEstado Id Estado de la cotizacion
     * @param int $idCliente Id del usuario
     * @return array
     */
    public function validarNumCaso($idSolicitud, $idEstado=0, $idCliente=0) {
        $this->db->where('id_solicitud', $idSolicitud);
        if ($idEstado) {
            $this->db->where('id_estado', $idEstado);
        }
        if ($idCliente) {
            $this->db->where('id_usuario', $idCliente);
        }
        $query = $this->db->get(self::STR_NOMBRE_TABLA);
    	return $query->result();
    }
}
